package com.coscon.utils;

import org.apache.commons.lang3.StringUtils;


/**
 * xss过滤处理
 * @author 409390047@qq.com
 * @Date: 2021/6/16 10:13
 */
public class XSSUtils {
    /**
     * 全角竖线
     **/
    public static final String SBC_VERTICAL_LINE = "｜";


    /**
     * @param @param  XSS 编码
     * @param @return 设定文件
     * @return String    返回类型
     * @throws
     * @Title: xssEncode_Parameter
     * @Description: TODO(将容易引起xss漏洞的半角字符直接替换成全角字符)
     */
    public static String xssEncodeParameter(String s) {
        if (StringUtils.isBlank(s)) {
            return s;
        }
        StringBuilder sb = new StringBuilder(s.length() + 16);
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            switch (c) {
                case '>':
                    sb.append('＞');// 全角大于号
                    break;
                case '<':
                    sb.append('＜');// 全角小于号
                    break;
                case '\'':
                    sb.append('‘');// 全角单引号
                    break;
                case '\"':
                    sb.append('“');// 全角双引号
                    break;
                case '$':
                    sb.append('＄');// 全角
                    break;
                case '|':
                    sb.append('｜');// 全角
                    break;
                case '#':
                    sb.append('＃');// 全角井号
                    break;
                default:
                    sb.append(c);
                    break;
            }
        }
        return sb.toString();
    }

    /**
     * @param @param  XSS解码
     * @param @return 设定文件
     * @return String    返回类型
     * @throws
     * @Title: xssDecode_Parameter
     * @Description: TODO(全角转半角 ， 解码一下)
     */
    public static String xssDecodeParameter(String s) {
        if (StringUtils.isBlank(s)) {
            return s;
        }
        StringBuilder sb = new StringBuilder(s.length() + 16);
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            switch (c) {
                case '＞':
                    sb.append('>');// 全角大于号
                    break;
                case '＜':
                    sb.append('<');// 全角小于号
                    break;
                case '‘':
                    sb.append('\'');// 全角单引号
                    break;
                case '“':
                    sb.append('\"');// 全角双引号
                    break;
                case '＆':
                    sb.append('&');// 全角
                    break;
                case '＄':
                    sb.append('$');// 全角
                    break;
                case '｜':
                    sb.append('|');// 全角
                    break;
                case '＃':
                    sb.append('#');// 全角井号
                    break;
                default:
                    sb.append(c);
                    break;
            }
        }
        return sb.toString();
    }




    /**
     * @param @param  XSS编码，针对JSON格式
     * @param @return 设定文件
     * @return String    返回类型
     * @throws
     * @Title: xssEncode_Parameter
     * @Description: TODO(将容易引起xss漏洞的半角字符直接替换成全角字符)
     */
    public static String xssEncodeParameterByJson(String s) {
        if (StringUtils.isBlank(s)) {
            return s;
        }
        StringBuilder sb = new StringBuilder(s.length() + 16);
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            switch (c) {
                case '>':
                    sb.append('＞');// 全角大于号
                    break;
                case '<':
                    sb.append('＜');// 全角小于号
                    break;
//                case '\'':
//                    sb.append('‘');// 全角单引号
//                    break;
//                case '\"':
//                    sb.append('“');// 全角双引号
//                    break;
                case '$':
                    sb.append('＄');// 全角
                    break;
                case '|':
                    sb.append('｜');// 全角
                    break;
                case '#':
                    sb.append('＃');// 全角井号
                    break;
                default:
                    sb.append(c);
                    break;
            }
        }
        return sb.toString();
    }


    public static String escapeValue(String value) {
        if (StringUtils.isBlank(value)) {
            return value;
        }
        return value.replace("|", SBC_VERTICAL_LINE);
    }
















    /**
     * @param @param  XSS 编码针对LDAP 的查询参数
     * @param @return 设定文件
     * @return String    返回类型
     * @throws
     * @Title: xssEncode_Parameter
     * @Description: TODO(将容易引起xss漏洞的半角字符直接替换成全角字符)
     */
    public static String xssEncodeParameterByLdap(String s) {
        if (StringUtils.isBlank(s)) {
            return s;
        }
        StringBuilder sb = new StringBuilder(s.length() + 16);
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            switch (c) {
                case '>':
                    sb.append('＞');// 全角大于号
                    break;
                case '<':
                    sb.append('＜');// 全角小于号
                    break;
                case '\'':
                    sb.append('‘');// 全角单引号
                    break;
                case '\"':
                    sb.append('“');// 全角双引号
                    break;
                case '$':
                    sb.append('＄');// 全角
                    break;
                case '|':
                    sb.append('｜');// 全角
                    break;
                case '#':
                    sb.append('＃');// 全角井号
                    break;
                case '(':
                    sb.append('（');// 全角井号
                    break;
                case ')':
                    sb.append('）');// 全角井号
                    break;
                case '=':
                    sb.append('＝');// 全角井号
                    break;
                case '!':
                    sb.append('！');// 全角井号
                    break;
                case '+':
                    sb.append('＋');// 全角井号
                    break;
                case '*':
                    sb.append('×');// 全角井号
                    break;
                default:
                    sb.append(c);
                    break;
            }
        }
        return sb.toString();
    }





}
